package collection;

import java.util.*;
import java.util.stream.Collectors;

/**
 *  终端操作:
 *  min:获取流中的最小值
 *  max:获取流中的最大值
 *  anyMatch:进行流中的元素任意匹配，只要有一个元素匹配成功则返回true
 *  allMatch:进行流中元素的全部匹配，只有都匹配才参会true
 *  noneMatch:当流中没有元素匹配则返回true
 *  reduce:积累操作，将流中所有元素最终积累成一个值
 */

public class StreamAPIDemo2 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Random random = new Random();
        for(int i=0;i<3;i++){
            list.add(random.nextInt(100));
        }
        System.out.println(list);
        /*
            找到集合中的最小值
            min()方法返回的是一个Optional对象，表示集合中的最小值，返回值类型是min内的值的类型
            optional有点像包装类，是将一个值包装称为一个对象
         */
        Optional<Integer> o = list.stream().min((e1,e2)->e1-e2);
        //最大值
        //Optional<Integer> o =list.stream().max((e1,e2)->(e1-e2));
        int num = o.get();//o.get(),这个方法就是获取对象的方法
        System.out.println(num);

        //查看集合中是否有偶数,anyMatch
        System.out.println("是否含有偶数："+list.stream().anyMatch(e->e%2==0));//boolean

        //查看集合中是否所有元素都>50,allMatch
        System.out.println("所有元素都大于50："+list.stream().allMatch(e->e>50));//boolean

        //集合中所有元素是否都是奇数,noneMatch
        System.out.println("是否都是奇数？："+ (list.stream().noneMatch(e->e%2==0)));//boolean

        /*
            积累操作
            reduce() 先将
         */
        //o=list.stream().reduce((e1,e2)->(e1+e2));
        //o=list.stream().reduce((e1,e2)->Integer.sum(e1,e2));//有这样一个方法可以相加
        o=list.stream().reduce(Integer::sum);//那么方法内操作的参数和参数列表的参数一样，可以用方法引用::
        num=o.get();
        System.out.println(num);
    }
}
